// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
// import com.alibaba.druid.sql.ast.statement.SQLExternalRecordFormat;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributesImpl;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
// import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../OracleSegmentAttributesImpl.h"
#include "../OracleSegmentAttributes.h"
#include "../OracleSQLObject.h"
#include "../../../../ast/statement/SQLCreateTableStatement.h"
#include "OracleDDLStatement.h"

class OracleCreateTableStatement_DeferredSegmentCreation
{
public:
  static OracleCreateTableStatement_DeferredSegmentCreation_ptr IMMEDIATE;
  static OracleCreateTableStatement_DeferredSegmentCreation_ptr DEFERRED;
  string_ptr name;
  uint64_t mask;
  OracleCreateTableStatement_DeferredSegmentCreation(uint64_t mask, string_ptr name);
};

class OracleCreateTableStatement_Organization
    : virtual public OracleSegmentAttributesImpl,
      virtual public OracleSegmentAttributes,
      virtual public OracleSQLObject
{
public:
  string_ptr type;

  SQLName_ptr externalType;
  SQLExpr_ptr externalDirectory;
  SQLExternalRecordFormat_ptr externalDirectoryRecordFormat;
  SQLExpr_list_ptr externalDirectoryLocation;
  SQLExpr_ptr externalRejectLimit;
  OracleCreateTableStatement_Organization();
  SHAREDOBJECT(OracleCreateTableStatement_Organization);
  void accept0(SQLASTVisitor_ptr visitor);

  void accept0(OracleASTVisitor_ptr visitor);

  string_ptr getType();

  void setType(string_ptr type);

  SQLName_ptr getExternalType();

  void setExternalType(SQLName_ptr externalType);

  SQLExpr_ptr getExternalDirectory();

  void setExternalDirectory(SQLExpr_ptr externalDirectory);

  SQLExternalRecordFormat_ptr getExternalDirectoryRecordFormat();

  void setExternalDirectoryRecordFormat(SQLExternalRecordFormat_ptr recordFormat);

  SQLExpr_ptr getExternalRejectLimit();

  void setExternalRejectLimit(SQLExpr_ptr externalRejectLimit);

  SQLExpr_list_ptr getExternalDirectoryLocation();
};

class OracleCreateTableStatement_OIDIndex
    : virtual public OracleSegmentAttributesImpl,
      virtual public OracleSQLObject
{
public:
  SQLName_ptr name;

  SHAREDOBJECT(OracleCreateTableStatement_OIDIndex);
  // @Override
  void accept0(OracleASTVisitor_ptr visitor);

  void accept0(SQLASTVisitor_ptr visitor);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);
};

class OracleCreateTableStatement
    : virtual public SQLCreateTableStatement,
      virtual public OracleDDLStatement,
      virtual public OracleSegmentAttributes
{
public:
  BOOL_ptr inMemoryMetadata;

  BOOL_ptr cursorSpecificSegment;

  // NOPARALLEL
  BOOL_ptr parallel;
  SQLExpr_ptr parallelValue;

  OracleStorageClause_ptr storage;
  OracleLobStorageClause_ptr lobStorage;

  int pctfree;
  int pctused;
  int initrans;
  int maxtrans;
  int pctincrease;

  int compressLevel;
  BOOL_ptr compressForOltp;

  BOOL_ptr cache;

  OracleCreateTableStatement_DeferredSegmentCreation_ptr deferredSegmentCreation;

  BOOL_ptr enableRowMovement;

  SQLName_list_ptr clusterColumns;
  SQLName_ptr cluster;

  OracleCreateTableStatement_Organization_ptr organization;

  SQLName_ptr of;
  OracleCreateTableStatement_OIDIndex_ptr oidIndex;
  BOOL_ptr monitoring;
  SQLName_list_ptr including;
  OracleXmlColumnProperties_ptr xmlTypeColumnProperties;

  void simplify();
  OracleCreateTableStatement();
  SHAREDOBJECT(OracleCreateTableStatement);

  OracleLobStorageClause_ptr getLobStorage();

  void setLobStorage(OracleLobStorageClause_ptr lobStorage);

  OracleCreateTableStatement_DeferredSegmentCreation_ptr getDeferredSegmentCreation();

  void setDeferredSegmentCreation(OracleCreateTableStatement_DeferredSegmentCreation_ptr deferredSegmentCreation);

  BOOL_ptr getCache();

  void setCache(BOOL_ptr cache);

  BOOL_ptr isOnCommitDeleteRows();

  void setOnCommitDeleteRows(BOOL_ptr onCommitDeleteRows);

  int getCompressLevel();

  void setCompressLevel(int compressLevel);

  int getPctfree();

  void setPctfree(int pctfree);

  int getPctused();

  void setPctused(int pctused);

  int getInitrans();

  void setInitrans(int initrans);

  int getMaxtrans();

  void setMaxtrans(int maxtrans);

  int getPctincrease();

  void setPctincrease(int pctincrease);

  BOOL_ptr getParallel();

  void setParallel(BOOL_ptr parallel);

  SQLExpr_ptr getParallelValue();

  void setParallelValue(SQLExpr_ptr x);

  BOOL_ptr isCursorSpecificSegment();

  void setCursorSpecificSegment(BOOL_ptr cursorSpecificSegment);

  BOOL_ptr isInMemoryMetadata();

  void setInMemoryMetadata(BOOL_ptr inMemoryMetadata);

  void accept0(SQLASTVisitor_ptr visitor);

  SQLObject_ptr getStorage();

  void setStorage(SQLObject_ptr storage);

  SQLName_ptr getOf();

  void setOf(SQLName_ptr of);

  OracleCreateTableStatement_OIDIndex_ptr getOidIndex();

  void setOidIndex(OracleCreateTableStatement_OIDIndex_ptr oidIndex);

  BOOL_ptr isMonitoring();

  void setMonitoring(BOOL_ptr monitoring);

  BOOL_ptr isCompressForOltp();

  void setCompressForOltp(BOOL_ptr compressForOltp);

  BOOL_ptr getEnableRowMovement();

  void setEnableRowMovement(BOOL_ptr enableRowMovement);

  SQLName_list_ptr getClusterColumns();

  SQLName_ptr getCluster();

  void setCluster(SQLName_ptr x);

  SQLName_list_ptr getIncluding();

  OracleCreateTableStatement_Organization_ptr getOrganization();

  void setOrganization(OracleCreateTableStatement_Organization_ptr organization);

  void accept0(OracleASTVisitor_ptr visitor);

  OracleXmlColumnProperties_ptr getXmlTypeColumnProperties();

  void setXmlTypeColumnProperties(OracleXmlColumnProperties_ptr x);
};
